package com.tanhua.sso.service;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tanhua.common.enums.SexEnum;
import com.tanhua.common.mapper.QuestionUserLockMapper;
import com.tanhua.common.mapper.UserInfoMapper;
import com.tanhua.common.pojo.User;
import com.tanhua.common.pojo.UserInfo;
import com.tanhua.common.service.PicUploadService;
import com.tanhua.common.utils.UserThreadLocal;
import com.tanhua.common.vo.PicUploadResult;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Map;

@Service
public class UserInfoService {



    @Autowired
    private UserService userService;

    @Autowired
    private UserInfoMapper userInfoMapper;

    @Autowired
    private FaceEngineService faceEngineService;

    @Autowired
    private PicUploadService picUploadService;

    /**
     * 保存用户个人信息的方法对应tb_user_info这张表
     * @param param
     * @param
     * @return
     */
    public Boolean  saveUserInfo(Map<String, String> param) {
        //获取User对象，无需对User对象校验，其一定不为null
        User user = UserThreadLocal.get();

        //不为空则创建一个UserInfo对象,需要的属性有gender,nickname,birthday,city
        UserInfo userInfo = new UserInfo();
        userInfo.setUserId(user.getId());
        userInfo.setSex(StringUtils.equalsIgnoreCase(param.get("gender"), "man") ? SexEnum.MAN : SexEnum.WOMAN);
//性别是一个枚举,此处先对获取的user对象的性别做判断,使用三元运算对userInfo对象赋值
        userInfo.setNickName(param.get("nickname"));
        userInfo.setBirthday(param.get("birthday"));
        userInfo.setCity(param.get("city"));
        //调用userInfoMapper使用mp中的方法将userInfo保存到数据库中,同时对返回的结果做判断如果等于1则代表返回成功,将结果返回给调用者
        return userInfoMapper.insert(userInfo) == 1;
    }

    /**
     * 保存用户上传的头像,并识别是否是人像
     * @param file
     * @return
     */
    public Boolean saveUserLogo(MultipartFile file,String token) {
        //获取User对象，无需对User对象校验，其一定不为null
        User user = userService.findUserByToken(token);
        if(ObjectUtil.isEmpty(user)){
            return false;
        }
        try {
            //校验图片是否是人像，如果不是人像就返回false,注意方法需要的参数为字节数组
            boolean b = faceEngineService.checkIsPortrait(file.getBytes());
            if (!b) {
                //如果返回false,说明不是人像返回false
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //校验成功之后将图片上传至阿里云oss.方法返回结果为PicUploadResult,包含了文件名等信息,这些方法和实体类都是提供好的,CV即可
        PicUploadResult result = picUploadService.upload(file);
        if (StringUtils.isEmpty(result.getName())) {
            //对上传结果进行判断,是否上床成功,上传失败返回false
            return false;
        }
        //上传成功之后将头像保存到用户信息表中
        UserInfo userInfo = new UserInfo();
        userInfo.setLogo(result.getName());
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", user.getId());
        //将结果保存到数据库中,应为该用户其他信息已经有了,所以调用的update方法
        return userInfoMapper.update(userInfo, queryWrapper) == 1;
    }
}
